package com.luzhikun.modifyRequestResponse;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

/*
 * @Author liu-miss
 * @Description 过滤器
 * @Date 9:34 2021/5/4
 *
 *
 * 多个过滤器之间执行的顺序和xml中注册的顺序一致
 *
 * Filter的执行原理：
 *
 *      一个Map和一个数组
 *      一个Map:Map的key为<url-patten>的值，value为Filter实例对象
 *      一个数组：存放着与请求相匹配的Filter
 *
 *      执行原理：
 *      当对某资源的请求到达Web容器时，会先对请求进行解析，使用解析处的URL作为比较对象，从Map中查找是否有相同的key
 *      若存在，那么读取其value，即Filter对象的引用，将该引用存入到数组中，然后继续向后查找，直到该Map查找完毕，这样
 *      数组就会存在按照查找顺序排好的Filter引用
 *      数组初始化完毕后，开始按照数组元素顺序进行执行，所有数组中的Filter全部执行完毕后，再跳转到请求的目标资源
 *
 **/
public class SomeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /*
     * @Author liu-miss
     * @Description 修改请求和响应
     * @Date 9:33 2021/5/4
     * @Param [request, response, chain]
     * @return void
     **/
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

        System.out.println("FIlter----before");

        // 修改请求:向请求域中添加了属性
        request.setAttribute("company", "腾跃有限公司");
        request.setAttribute("manger", "鲁志坤");

        // 放行到下一个资源
        chain.doFilter(request, response);

        System.out.println("FIlter----after");

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("-----------SomeFilter-----------<br>");
    }

    @Override
    public void destroy() {

    }
}
